
Qlb = window.Qlb || {};
Qlb.LIB = Qlb.LIB || {};
Qlb.LIB.TabShow = (function() {
  return {
    init : function(cfg) {
      try {
        var _def = {
          tabs : $('#tabs>li'),
          cnts : $('#cnts>div'),
          btnPrev : $('#btn_prev'),
          btnNext : $('#btn_next'),
          curId : 0,
          keyName : 'key',
          eventType : 'click',  // mouseover
          autoPlay : false,
          delay : 3000
        };
        cfg = $.extend(_def, cfg);

        var _curId = cfg.curId;
        var _curKeyId = cfg.curKeyId;
        var _timer = null;
        var _locked = false;
        var _isFading = false;
        //var _count = (cfg.tabs.length < cfg.cnts.length) ? cfg.tabs.length : cfg.cnts.length;
        var _count = cfg.cnts.length;
        cfg.hasTabs = (cfg.tabs.length > 0) ? true : false;

        // 初始化
        for (var i = 0; i < _count; i++) {
          // 添加key值
          if (cfg.hasTabs) {
            var tab = $(cfg.tabs[i]);
            if (!tab.attr(cfg.keyName)) {
              tab.attr((cfg.keyName), i);
            }
            if (i == _curId) {
              $(cfg.tabs[i]).addClass('cur');
            } else {
              $(cfg.tabs[i]).removeClass('cur');
            }
          }

          var cnt = $(cfg.cnts[i]);
          if (!cnt.attr(cfg.keyName)) {
            cnt.attr((cfg.keyName), i);
          }
          if (i == _curId) {
            $(cfg.cnts[i]).css({'display' : ''});
          } else {
            $(cfg.cnts[i]).css({'display' : 'none'});
          }
        }

        // 自动播放
        if (cfg.autoPlay) {
          _timer = setInterval(function() {
            showNext(1);
          }, cfg.delay);
        }

        if (cfg.hasTabs) {
          // tabs可能会动态增加，因此必须用live绑定
          cfg.tabs.live(cfg.eventType, function() {
            var id = parseInt($(this).attr(cfg.keyName));
            //showByKeyId(keyId);
            if (cfg.eventType == 'mouseover') {
              showById(id, true);  // 避免鼠标移动过快
            } else {
              showById(id);
            }
          });

          cfg.tabs.mouseover(function() {
            _locked = true;
          }).mouseout(function() {
            _locked = false;
          });
        }

        cfg.cnts.mouseover(function() {
          _locked = true;
        }).mouseout(function() {
          _locked = false;
        });

        if (cfg.btnPrev[0]) {
          cfg.btnPrev.click(function() {
            _locked = false;
            showNext(-1);
            _locked = true;
          }).mouseout(function() {
            _locked = false;
          });
        }

        if (cfg.btnNext[0]) {
          cfg.btnNext.click(function() {
            _locked = false;
            showNext(1);
            _locked = true;
          }).mouseout(function() {
            _locked = false;
          });
        }

        function showByKeyId(keyId) {
          if (keyId != _curKeyId) {
            _curKeyId = keyId;
            showById(keyId);
          }
        }

        function showById(curId, direct) {
          //$('#jsTips').html(_curId + ' / ' + curId);
          //alert(curId + '/' + _curId);
          if (curId != _curId && !_isFading) {
            if (direct) {
              if (cfg.hasTabs) {
                if (_curId >= 0) {
                  $(cfg.tabs[_curId]).removeClass('cur');
                }
                $(cfg.tabs[curId]).addClass('cur');
              }
              if (_curId >= 0) {
                $(cfg.cnts[_curId]).css({'display' : 'none'});
              }
              $(cfg.cnts[curId]).css({'display' : ''});
              _isFading = false;
              _curId = curId;
            } else {
              _isFading = true;
              if (_curId >= 0) {
                $(cfg.cnts[_curId]).fadeOut(100, function() {
                  if (cfg.hasTabs) {
                    $(cfg.tabs[_curId]).removeClass('cur');
                    $(cfg.tabs[curId]).addClass('cur');
                  }
                  $(cfg.cnts[curId]).fadeIn(600, function() {
                    _isFading = false;
                    _curId = curId;
                  });
                });
              } else {
                $(cfg.cnts[curId]).fadeIn(600, function() {
                  _isFading = false;
                  _curId = curId;
                });
              }
            }
          }
        }

        function showNext(step) {
          if (!_locked) {
            var id = _curId + step;
            id = (id < 0) ? (_count - 1) : id;
            id = (id >= _count) ? 0 : id;
            showById(id);
          }
        }
      } catch(e) {
        alert(e);
      }
    }
  }
})();
